package cn.mccraft.uide.api.property.value;

import java.util.Optional;

import javax.annotation.Nonnull;

import com.google.common.reflect.TypeToken;

import cn.mccraft.uide.api.property.JsonSerializable;

public interface Value<E> extends JsonSerializable{

	E getValue();
	
	default E getOrDefault(E defaultValue) {
		E value = getValue();
		return value == null ? value : defaultValue;
	}
	
	default Optional<E> getDirect() {
		return Optional.ofNullable(getValue());
	}

	void setValue(E value);
	
	@Nonnull
	default TypeToken<E> getType() {
		return new TypeToken<E>() {};
	}
}
